package com.skyd.core.common;

/**
 * 方位
 * 
 * @author SkyD
 * 
 */
public class Direction {

	public  static final int  LEFT=1;
	public  static final int  RIGHT=2;
	public  static final int  TOP=4;
	public  static final int  BOTTOM=8;
	public  static final int  CENTER=0;
	
	/**
	 * 创建左方位实例
	 * @return
	 */
	public static Direction createLeftDirection(){
		return new Direction(LEFT);
	}
	/**
	 * 创建右方位实例
	 * @return
	 */
	public static Direction createRightDirection(){
		return new Direction(RIGHT);
	}
	/**
	 * 创建上方位实例
	 * @return
	 */
	public static Direction createTopDirection(){
		return new Direction(TOP);
	}
	/**
	 * 创建下方位实例
	 * @return
	 */
	public static Direction createBottomDirection(){
		return new Direction(BOTTOM);
	}
	/**
	 * 创建中方位实例
	 * @return
	 */
	public static Direction createCenterDirection(){
		return new Direction(CENTER);
	}
	
	/**
	 * 判断当前方位是否为左
	 * @return 判断结果
	 */
	public boolean isLeft(){
		return Value==LEFT;
	}
	/**
	 * 判断当前方位是否为右
	 * @return 判断结果
	 */
	public boolean isRight(){
		return Value==RIGHT;
	}
	/**
	 * 判断当前方位是否为上
	 * @return 判断结果
	 */
	public boolean isTop(){
		return Value==TOP;
	}
	/**
	 * 判断当前方位是否为下
	 * @return 判断结果
	 */
	public boolean isBottom(){
		return Value==BOTTOM;
	}
	/**
	 * 判断当前方位是否为中
	 * @return 判断结果
	 */
	public boolean isCenter(){
		return Value==CENTER;
	}

	public int Value;

	/**
	 * 构造函数
	 * @param value 实际值
	 */
	public Direction(int value) {
		Value = value;
	}

	/**
	 * 将另一个方位组合到当前对象
	 * @param d Direction对象
	 * @return 当前对象
	 */
	public Direction Combination(Direction d) {
		this.Value = this.Value | d.Value;
		return this;
	}

	/**
	 * 判断两个方位是否相同
	 * @param d Direction对象
	 * @return 判断结果
	 */
	public boolean Is(Direction d) {
		return this.Value == d.Value;
	}

	/**
	 * 判断当前方位中是否包含目标方位的全部或一部分
	 * @param d Direction对象
	 * @return 判断结果
	 */
	public boolean IsContain(Direction d) {
		return (this.Value & d.Value) > 0;
	}
	
	/**
	 * 将当前对象设置为与目标方位之间的交集
	 * @param d Direction对象
	 * @return 当前对象
	 */
	public Direction Intersection(Direction d)
	{
		this.Value = this.Value & d.Value;
		return this;
	}
	
	/**
	 * 将另一个方位组合到当前对象
	 * @param v 目标方位值
	 * @return 当前对象
	 */
	public Direction Combination(int v) {
		this.Value = this.Value | v;
		return this;
	}

	/**
	 * 判断两个方位是否相同
	 * @param v 目标方位值
	 * @return 判断结果
	 */
	public boolean Is(int v) {
		return this.Value == v;
	}

	/**
	 * 判断当前方位中是否包含目标方位的全部或一部分
	 * @param v 目标方位值
	 * @return 判断结果
	 */
	public boolean IsContain(int v) {
		return (this.Value & v) > 0;
	}
	
	/**
	 * 将当前对象设置为与目标方位之间的交集
	 * @param v 目标方位值
	 * @return 当前对象
	 */
	public Direction Intersection(int v)
	{
		this.Value = this.Value & v;
		return this;
	}
}